home *** CD-ROM | disk | FTP | other *** search
/ ftp.whtech.com / ftp.whtech.com.tar / ftp.whtech.com / datasheets and manuals / Hardware / WHT / scsi / dsr_sources_2_2001 / 0dsr next >
Text File  |  2006-10-19  |  8KB  |  391 lines

  1. * DEVICE SERVICE ROUTINES
  2. *
  3. * This modules takes care of all the high level I/O to
  4. * the SCSI drives (Open, close, read, write, etc)
  5. *
  6.  
  7. SCSI0  CLR  R6
  8.        JMP  SCSDSR
  9. SCSI1  LI   R6,>0100
  10.        JMP  SCSDSR
  11. SCSI2  LI   R6,>0200
  12.        JMP  SCSDSR
  13. SCSI3  LI   R6,>0300
  14.        JMP  SCSDSR
  15. SCSI4  LI   R6,>0400
  16.        JMP  SCSDSR
  17. SCSI5  LI   R6,>0500
  18.        JMP  SCSDSR
  19. SCSI6  LI   R6,>0600
  20.        JMP  SCSDSR
  21. SCSI7  LI   R6,>0700
  22.        JMP  SCSDSR
  23. DSK1   LI   R6,>0001
  24.  
  25. SCSDSR
  26.        ANDI R12,>FF00
  27.        AI   R12,24
  28.        LDCR @ZERO,4      Make sure RAM bank 0 is active
  29.        MOV  R1,@SAVR1
  30.        MOV  R11,@SAVR11
  31.  
  32.        LI   R0,STINIT    Reset the stack pointer for BANKIT
  33.        MOV  R0,@STACK
  34.  
  35. * Copy the PAB to our buffer and the file name to the
  36. * name compare buffer in RAM bank 2
  37. *
  38.        MOV  @>8356,R4
  39.        S    @>8354,R4
  40.        AI   R4,-10
  41.        MOV  R4,@PABADR
  42.        SWPB R4
  43.        MOVB R4,@VDPWA
  44.        SWPB R4
  45.        MOVB R4,@VDPWA
  46.        LI   R5,10
  47.        LI   R4,PABBUF
  48. SCSD01 MOVB @VDPRD,*R4+
  49.        DEC  R5
  50.        JNE  SCSD01
  51.  
  52. * Now make sure we're not trying to do I/O to the
  53. * SCSI card.
  54. *
  55.        ANDI R12,>FF00
  56.        AI   R12,8
  57.        CLR  R2
  58.        STCR R2,3         Read SCSI address of the card
  59.        CB   R2,R6        See if it matches
  60.        JNE  DSR3
  61.        BL   @DSRERR
  62.        DATA >0300        Illegal operation
  63.  
  64. DSR3
  65. *
  66. * Now copy the name of the file to the name compare
  67. * buffer in banks 2 and 4.
  68. * We also check that the name is not longer than 40
  69. * characters, contains only valid characters and
  70. * that there are not more than 10 characters between
  71. * periods.
  72. *
  73. * If we are doing DSK emulation, prefix the filename
  74. * with the appriproate directory
  75. *
  76.  
  77.        MOVB @PABBUF+9,R1 Set the file name length
  78.        SRL  R1,8
  79.  
  80.        ANDI R12,>FF00
  81.        AI   R12,24
  82.        LDCR @B02,4       Select RAM bank 2
  83.  
  84.        LI   R3,NCB       Name Compare Buffer
  85.        LI   R2,40        Maximum name length
  86.        CLR  R7           Number of characters between periods
  87.        JMP  DSR5
  88.  
  89. DSR4   BL   @DSRERR      Name too long!
  90.        DATA >0700        Bad open attribute?
  91.  
  92. DSR5
  93.  
  94. * If we are doing DSKx emulation, prefix the filename
  95. *
  96.        MOV  R6,R8
  97.        ANDI R8,>00FF
  98.        JEQ  DSR5B
  99.  
  100.        MOV  @DS,*R3+         copy the 'DS'
  101.        MOVB @ASCIIK,*R3+     copy the 'K'
  102.        AI   R8,48
  103.        SWPB R8
  104.        MOVB R8,*R3+
  105.        MOVB @PERIOD,*R3+
  106.        AI   R2,-5            Maximum length is 5 less
  107.  
  108. DSR5B  C    R1,@>8354
  109.        JEQ  DSR7         Pad everything!
  110.        S    @>8354,R1    Subtract device name length
  111.        DEC  R1           Account for period after device name
  112.        JEQ  DSR7
  113.        C    R1,R2        See if name > 40 characters
  114.        JH   DSR4
  115.        S    R1,R2        Compute number of spaces we will have to pad
  116.  
  117.        MOVB @>8357,@VDPWA Set VDP read address to
  118.        NOP                file name
  119.        MOVB @>8356,@VDPWA
  120.        NOP
  121.        MOVB @VDPRD,R0    Ignore the period after the device name
  122.        NOP
  123.  
  124. DSR5A  MOVB @VDPRD,R5
  125.        CB   R5,@SPACE
  126.        JLE  DSR4         Illegal character
  127.        CB   R5,@B126
  128.        JH   DSR4         Illegal character
  129.  
  130.        MOVB R5,*R3+
  131.        CB   R5,@PERIOD
  132.        JNE  DSR6
  133.        CI   R7,0
  134.        JEQ  DSR4
  135.        CI   R7,10
  136.        JH   DSR4
  137.        SETO R7
  138.  
  139. DSR6   INC  R7
  140.        DEC  R1
  141.        JNE  DSR5A
  142.  
  143. * Make sure the last part of the name is not too long
  144. *
  145.        CI   R7,10
  146.        JH   DSR4
  147.  
  148. * Now pad the rest of the name with spaces
  149. *
  150.  
  151.        CI   R2,0
  152.        JEQ  DSR8
  153. DSR7   MOVB @SPACE,*R3+
  154.        DEC  R2
  155.        JNE  DSR7
  156.  
  157. * Now copy it to the name compare buffer in bank 4
  158. *
  159. DSR8   LI   R3,NCB
  160.        LI   R2,40
  161. DSR9   MOV  *R3,R4
  162.        LDCR @B04,4
  163.        MOV  R4,*R3+
  164.        LDCR @B02,4
  165.        DECT R2
  166.        JNE  DSR9
  167.  
  168. * Check the I/O Opcode and call the appripriate routine
  169. *
  170.  
  171. * If we are doing DSKx emulation, only let the LOAD I/O
  172. * op code go through.
  173.  
  174.  
  175.        LDCR @ZERO,4
  176.        CB   @PABBUF,@B05
  177.        JNE  DSR10
  178.  
  179. DSRIO5 BL   @XFER
  180.        DATA LOAD
  181. DSR10
  182.        MOV  R6,R0             Check for emulation
  183.        ANDI R0,>00FF
  184.        JNE  DSR19
  185.  
  186.        MOVB @PABBUF,R1
  187.        SRL  R1,8
  188.        CI   R1,9
  189.        JH   DSR18
  190.        SLA  R1,1
  191.        MOV  @IOJTBL(R1),R1
  192.        B    *R1
  193.  
  194. IOJTBL DATA DSRIO0
  195.        DATA DSRIO1
  196.        DATA DSRIO2
  197.        DATA DSRIO3
  198.        DATA DSRIO4
  199.        DATA DSRIO5
  200.        DATA DSRIO6
  201.        DATA DSRIO7
  202.        DATA DSR18
  203.        DATA DSRIO9
  204.  
  205. DSRIO0 BL   @XFER
  206.        DATA OPEN
  207. DSRIO1 BL   @XFER
  208.        DATA CLOSE
  209. DSRIO2 BL   @XFER
  210.        DATA READ
  211. DSRIO3 BL   @XFER
  212.        DATA WRITE
  213. DSRIO4 BL   @XFER
  214.        DATA REWIND
  215. DSRIO6 BL   @XFER
  216.        DATA SAVE
  217. DSRIO7 BL   @XFER
  218.        DATA DELETE
  219. DSRIO9 BL   @XFER
  220.        DATA STATUS
  221. DSR18
  222.        ANDI R12,>FF00
  223.        MOV  @SAVR1,R1
  224.        MOV  @SAVR11,R11
  225.        INCT R11
  226. DSR19  RT
  227.  
  228. **
  229. *
  230. * Here is where we have to compare label names to
  231. * see which disk we are truely accessing.
  232. *
  233. **
  234.  
  235. DSR20  ANDI R12,>FF00
  236.        AI   R12,24
  237.        LDCR @ZERO,4
  238.  
  239.        MOV  R1,@SAVR1
  240.        MOV  R11,@SAVR11
  241.  
  242.        LI   R0,STINIT    Reset the stack pointer for BANKIT
  243.        MOV  R0,@STACK
  244.  
  245. * Now we have to check our table of disk labels.  If the VIB
  246. * hasn't been read on a disk yet, the entry will be null.
  247.  
  248. * Copy the PAB from VDP memory to a buffer in bank 0
  249.  
  250.        MOV  @>8356,R4        Get pointer to file name
  251.        S    @>8354,R4
  252.        AI   R4,-10
  253.        MOV  R4,@PABADR
  254.        SWPB R4
  255.        MOVB R4,@VDPWA
  256.        SWPB R4
  257.        MOVB R4,@VDPWA
  258.        LI   R5,10
  259.        LI   R4,PABBUF
  260. DSR21  MOVB @VDPRD,*R4+
  261.        DEC  R5
  262.        JNE  DSR21
  263.  
  264.        DEC  R4
  265.        MOVB *R4,R2           Get file name length
  266.        SRL  R2,8
  267.        S    @>8354,R2
  268.        JEQ  DSR23            No label given - error
  269.        DEC  R2
  270.        JEQ  DSR23
  271.  
  272.        MOVB @>8357,@VDPWA
  273.        NOP
  274.        MOVB @>8356,@VDPWA
  275.        NOP
  276.        MOVB @VDPRD,R0        Ignore the period
  277.  
  278.        LDCR @B02,4           Select RAM bank 2
  279.        LI   R3,NCB
  280. DSR22  MOVB @VDPRD,R0
  281.        DEC  R2
  282.        CB   R0,@PERIOD
  283.        JEQ  DSR25
  284.        MOVB R0,*R3+
  285.        CI   R2,0
  286.        JEQ  DSR25
  287.        CI   R3,NCB+10
  288.        JNE  DSR22
  289.  
  290. * The label given is longer than 10 characters.  No way can it
  291. * match anything.  Give up here.
  292.  
  293. DSR23  LDCR @ZERO,4
  294.        MOV  @SAVR1,R1
  295.        ANDI R12,>FF00
  296.        RT
  297.  
  298. DSR24  MOVB @SPACE,*R3+
  299. DSR25  CI   R3,NCB+10
  300.        JNE  DSR24
  301.  
  302. **
  303. *
  304. * Now that we have the label in our compare buffer, check to
  305. * see if there are any SCSI drives that have a label that
  306. * matches.
  307. *
  308. **
  309.  
  310.        CLR  R6               Start with SCSI ID=0
  311.        LI   R5,DLTABL
  312.        LDCR @B02,4           Select RAM bank 2
  313.  
  314. DSR26  C    *R5,@MINUS1
  315.        JEQ  DSR28
  316.        C    *R5,@ZERO
  317.        JNE  DSR31
  318.  
  319.        LDCR @ZERO,4          We have to read the label
  320.        CLR  R7
  321.        CLR  R8
  322.        BLWP @BANKIT
  323.        DATA SCSIRD
  324.        JEQ  DSR29
  325. DSR27  SETO *R5
  326. DSR28  LDCR @B02,4
  327.        AI   R5,10
  328.        AI   R6,>0100
  329.        CI   R6,>0800
  330.        JNE  DSR26
  331.        JMP  DSR23            No match - error
  332.  
  333. DSR29  LI   R7,SECBUF        * Now move label to table
  334.        LI   R0,10
  335. DSR30  MOV  *R7+,R8
  336.        LDCR @B02,4
  337.        MOV  R8,*R5+
  338.        LDCR @ZERO,4
  339.        DECT R0
  340.        JNE  DSR30
  341.        LDCR @B02,4
  342.        AI   R5,-10
  343.  
  344. DSR31  LI   R0,10
  345.        LI   R7,NCB
  346.        MOV  R5,R8
  347. DSR32  C    *R7+,*R8+
  348.        JNE  DSR28
  349.        DECT R0
  350.        JNE  DSR32
  351.  
  352. * Hooray!  We found a match!  Now copy the real filename to
  353. * the filename compare buffer
  354.  
  355.        LI   R3,NCB
  356.        CI   R2,0             Check for no name (i.e.
  357.        JEQ  DSR34             directory access)
  358.        CI   R2,40            Check file name length
  359.        JLE  DSR33
  360.  
  361.        BL   @DSRERR          File name too long!
  362.        DATA >0700
  363.  
  364. DSR33  MOVB @VDPRD,*R3+
  365.        DEC  R2
  366.        JNE  DSR33
  367.  
  368. DSR34  CI   R3,NCB+40
  369.        JEQ  DSR35
  370.        MOVB @SPACE,*R3+
  371.        JMP  DSR34
  372.  
  373. DSR35  B    @DSR8
  374.  
  375. * Let's display our file name for fun
  376. *
  377. *DSR35  CLR   @VDPWA
  378. *      LI    R1,>4040
  379. *      MOV   R1,@VDPWA
  380. *      LI    R0,40
  381. *      LI    R3,NCB
  382. *SR999 MOVB  *R3+,@VDPWD
  383. *      DEC   R0
  384. *      JNE   DSR999
  385. *SR888 JMP   DSR888
  386.  
  387. DS     DATA 'DS'
  388. MINUS1 DATA >FFFF
  389. ASCIIK BYTE 'K'
  390. B126   BYTE 126
  391.